/*
 * Carlos: 
 */
package infb.actions;

import java.text.ParseException;
import javax.naming.NamingException;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import infb.forms.*;
import infb.dao.*;
import infb.errores.*;
import infb.modelo.*;
import infb.util.*;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.apache.struts.upload.FormFile;

public class GestionMedicosAction extends Action {
    
    /*
     * Metodo guardar la foto en un archivo
     */
    private void AlmacenarFoto(FormFile foto, String nombreArchivo) {
            String path = "C:/workspace/InfB/GestionHospitalaria/web/fotos/medicos/"+nombreArchivo;
            try {
                File f = new File(path);
                if (makeSureDirectoryExists(parent(f))) {
                    FileOutputStream out = new FileOutputStream(f);
                    out.write(foto.getFileData());
                    out.flush();
                    out.close();
                }
            }
            catch (Exception ex) {
                throw new GestionHospitalariaException("Error: No se pudo almacenar correctamente la foto " + ex.getMessage());
            }
    }

    /**
    * Devuelve la ruta padre del subdirectorio actual
    * @param File --> El archivo del cual se quiere sacar su directorio o directorio padre
    * @return File --> Crea un archivo con la ruta del directorio padre
    */
    private File parent(File f) {
        String dirname = f.getParent();
        if (dirname == null ) {
            return new File(File.separator);
        }
        return new File(dirname);
    }

    /**
    * Crear un subdirectorio si este no existe
    * @param dir --> El path del archivo (dirección + nombre)
    * @return True -> Existe o se ha creado False --> No existe y no se ha podido crear
    */
    private boolean makeSureDirectoryExists(File dir) {
        if (!dir.exists()) {
            if (makeSureDirectoryExists(parent(dir)))
                dir.mkdir();
            else
                return false ;
        }
        return true ;
    }

    private ActionForward crearMedicos(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException, NamingException, ParseException {
        try {
            Context contexto = new InitialContext();
            MedicosInterfaz medicoInterfaz = (MedicosInterfaz) contexto.lookup("MedicosEJB");
            SetMedicosForm formularioMedico = (SetMedicosForm) form;


            String dni = formularioMedico.getDni();
            String num_colegiado = formularioMedico.getNum_colegiado();
            String nombre = formularioMedico.getNombre();
            String apellido1 = formularioMedico.getApellido1();
            String apellido2 = formularioMedico.getApellido2();

            String foto;
            FormFile fotoFile = formularioMedico.getFoto();
            if (fotoFile.getFileSize()== 0){
                foto="sin_imagen.jpg";
            }else{
                foto=dni+"_"+fotoFile.getFileName();
                AlmacenarFoto(fotoFile,foto);
            }
            fotoFile.destroy();
            String telefono = formularioMedico.getTelefono();
            String mail = formularioMedico.getMail();
            String especialidad = formularioMedico.getEspecialidad();
            String hora_inicio_consulta = formularioMedico.getHora_inicio_consulta();
            String hora_fin_consulta = formularioMedico.getHora_fin_consulta();

            Short shortHora_inicio_consulta = Short.valueOf(hora_inicio_consulta);
            Short shortHora_fin_consulta = Short.valueOf(hora_fin_consulta);

            Short.valueOf(hora_fin_consulta);


            String fechaCad = formularioMedico.getFecha_incorporacion();
            Date fecha;
            if (!fechaCad.equals("")) {
                SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
                fecha = sdf.parse(fechaCad);
            } else {
                fecha = null;
            }

            String direccion = formularioMedico.getDireccion();

            String password = formularioMedico.getPassword();
            //borro todos los atributos relacionados con la creacion/modificacion de medicos
            HttpSession sesion = peticion.getSession();
            sesion.removeAttribute("fechaIncorporacion");
            sesion.removeAttribute("objetoModificar");
            sesion.removeAttribute("objetoValidar");
            Medicos medico = new Medicos(dni, num_colegiado, nombre, apellido1, apellido2, foto, telefono, mail, fecha, direccion, password, especialidad, shortHora_inicio_consulta, shortHora_fin_consulta);
            medicoInterfaz.create(medico);
        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO PacientesInterfaz " + ne.getMessage());
        }

        return mapping.findForward("ok");
    }

    private ActionForward cargarMedicos(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        try {
            Context contexto = new InitialContext();
            EspecialidadesInterfaz especialidades = (EspecialidadesInterfaz) contexto.lookup("EspecialidadesEJB");

            // Recuperamos la sesion del usuario
            HttpSession sesion = peticion.getSession();
            sesion.setAttribute("fechaIncorporacion", null);
            sesion.setAttribute("objetoValidar", null);

            List listaEspecialidades = especialidades.findAll();
            sesion.setAttribute("lista_especialidades", listaEspecialidades);

            MedicosInterfaz iMedico = (MedicosInterfaz) contexto.lookup("MedicosEJB");
            String idMedico = peticion.getParameter("dni");
            Medicos medico = iMedico.find(idMedico);

            if (medico.getFechaIncorporacion() != null) {
            }
            if (medico == null) {
                throw new GestionHospitalariaException("Error: El identificador del medico pasado como parámetro no existe");
            }

            //  Incorporamos el bean en la sesion
            sesion.setAttribute("objetoModificar", medico);

            // Redirigimos hacia la vista
            return mapping.findForward("ok");
        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO MedicosInterfaz " + ne.getMessage());
        } catch (NumberFormatException nfe) {
            throw new GestionHospitalariaException("Error: El identificador del medico debe ser una cadena de caracteres " + nfe.getMessage());
        }
    }
    /*
     * Metodo interno destinado a la modificacion de medicos
     */

    private ActionForward prepararInsercion(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        try {
            Context contexto = new InitialContext();
            EspecialidadesInterfaz especialidades = (EspecialidadesInterfaz) contexto.lookup("EspecialidadesEJB");
            List listaEspecialidades = especialidades.findAll();
            HttpSession sesion = peticion.getSession();



            sesion.setAttribute("lista_especialidades", listaEspecialidades);
            return mapping.findForward("ok");
        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO EspecialidadesInterfaz: " + ne.getMessage());
        }

    }
    /*
     * Metodo interno destinado a la modificacion de medicos
     */

    private ActionForward modificarMedicos(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException, NamingException, ParseException {

        Context contexto = new InitialContext();
        MedicosInterfaz iMedico = (MedicosInterfaz) contexto.lookup("MedicosEJB");
        EspecialidadesInterfaz iEspecialidad = (EspecialidadesInterfaz) contexto.lookup("EspecialidadesEJB");

        SetMedicosForm formularioDatos = (SetMedicosForm) form;

        HttpSession sesion = peticion.getSession();
        Medicos medico = iMedico.find(((Medicos) sesion.getAttribute("objetoModificar")).getDni());
        System.out.println("MEDICO_NOMBRE: " + medico.getNombre());
        System.out.print("MEDICO_APELLIDO1: " + medico.getApellido1());
        System.out.print("MEDICO_NUMCOLEGIADO: " + medico.getNumColegiado());
        medico.setNumColegiado(formularioDatos.getNum_colegiado());
        medico.setDni(formularioDatos.getDni());
        medico.setNombre(formularioDatos.getNombre());
        medico.setApellido1(formularioDatos.getApellido1());
        medico.setApellido2(formularioDatos.getApellido2());
        String foto;
        String dni=medico.getDni();
        FormFile fotoFile = formularioDatos.getFoto();
        if (fotoFile.getFileSize()== 0){
            foto="sin_imagen.jpg";
        }else{
            foto=dni+"_"+fotoFile.getFileName();
            AlmacenarFoto(fotoFile,foto);
        }
        medico.setFoto(foto);
        fotoFile.destroy();
        medico.setTelefono(formularioDatos.getTelefono());
        medico.setMail(formularioDatos.getMail());
        medico.setDireccion(formularioDatos.getDireccion());
        // SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
        // medico.setFechaIncorporacion(sdf.parse(formularioDatos.getFecha_incorporacion()));
        String fechaCad = formularioDatos.getFecha_incorporacion();
        Date fecha;
        if (!fechaCad.equals("")) {
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
            fecha = sdf.parse(fechaCad);
        } else {
            fecha = null;
        }
        medico.setFechaIncorporacion(fecha);
        medico.setPassword(formularioDatos.getPassword());


        medico.setHoraInicioConsulta(Short.valueOf(formularioDatos.getHora_inicio_consulta()));
        medico.setHoraFinConsulta(Short.valueOf(formularioDatos.getHora_fin_consulta()));
        medico.setEspecialidad(iEspecialidad.buscarEspecialidadporNombre(formularioDatos.getEspecialidad()));

        iMedico.edit(medico);

        String perfil = (String) sesion.getAttribute("perfil");
        if (perfil.equals("medico")) {
            Medicos usuario = (Medicos) sesion.getAttribute("usuario");
            if (usuario.getDni().equals(medico.getDni())) {
                //me estoy modificando YO
                sesion.setAttribute("usuario", medico);
            }
        }


        sesion.removeAttribute("objetoModificar");
        peticion.setAttribute("mensaje", "El medico ha sido modificado correctamente");
        peticion.setAttribute("urlRetorno", "index.jsp");
        return mapping.findForward("ok");
    }

    /*
     * Metodo interno destinado a la eliminacion de medicos
     */
    private ActionForward eliminarMedicos(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException, NamingException {
        Context contexto = new InitialContext();
        MedicosInterfaz medicoInterfaz = (MedicosInterfaz) contexto.lookup("MedicosEJB");
        Medicos medico;

        String[] arrayNombres = peticion.getParameterValues("dni");
        List listaNombres = new ArrayList();
        listaNombres = arrayToList(arrayNombres);

        for (int i = 0; i < listaNombres.size(); i++) {
            medico = medicoInterfaz.find(listaNombres.get(i));
            medicoInterfaz.remove(medico);
        }

        return mapping.findForward("eliminar_ok");
    }

    /*
     * Metodo interno destinado a ver datos de un medico
     */
    private ActionForward verMedicos(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException, NamingException {
        try {
            Context contexto = new InitialContext();
            MedicosInterfaz medicos = (MedicosInterfaz) contexto.lookup("MedicosEJB");
            HttpSession sesion=peticion.getSession();
            String perfil=(String)sesion.getAttribute("perfil");
            String dni =null;
            if(perfil.equals("paciente")){
                dni =((Pacientes)sesion.getAttribute("usuario")).getMedico().getDni();
            }else{
                dni = new String(peticion.getParameter("dni"));
            }
            Medicos medico = medicos.find(dni);
            if (medico == null) {
                throw new GestionHospitalariaException("Error: El identificador del medico pasado como parámetro no existe");
            }

            // Incorporamos el bean en la sesion
          /*  
            sesion.setAttribute("ve_medico",medico);*/
            peticion.setAttribute("medico", medico);
        // Redirigimos hacia la vista

        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO MedicosInterfaz " + ne.getMessage());
        } catch (NumberFormatException nfe) {
            throw new GestionHospitalariaException("Error: El identificador del medico debe ser un cadena " + nfe.getMessage());
        }
        return mapping.findForward("ver_ok");
    }
    /*
     * Metodo interno destinado al listado de medicos
     */

    private <T> List<T> arrayToList(T[] array) {
        List lista = new ArrayList<T>();
        if (array != null) {
            for (int i = 0; i < array.length; i++) {
                lista.add(array[i]);
            }
        }
        return lista;
    }

    private ActionForward listarMedicos(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException, NamingException {
        try {
            Context contexto = new InitialContext();
            MedicosInterfaz medicoInterfaz = (MedicosInterfaz) contexto.lookup("MedicosEJB");

            // Recuperamos la sesion del usuario
            HttpSession sesion = peticion.getSession();
            EspecialidadesInterfaz especialidades = (EspecialidadesInterfaz) contexto.lookup("EspecialidadesEJB");
            Paginador p = new Paginador(medicoInterfaz.findAll(), peticion);
            List listaMedicos = p.getResultadosPaginados();
            List listaEspecialidades = especialidades.findAll();
            String[] arrayNombres = peticion.getParameterValues("ncolegiado");
            List listaNombres = arrayToList(arrayNombres);

            peticion.setAttribute("lista_nombres", listaNombres);
            peticion.setAttribute("lista_medicos", listaMedicos);
            sesion.setAttribute("lista_especialidades", listaEspecialidades);
            peticion.setAttribute("navegacion", p.getNavegacion());
            peticion.setAttribute("informacion", p.getMetaInformacion());


        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO PacientesInterfaz " + ne.getMessage());
        }
        return mapping.findForward("listar_ok");
    }

    /*
     * Metodo interno destinado al listado de medicamentos
     */
    private ActionForward buscarMedicos(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {

        try {
            Context contexto = new InitialContext();
            MedicosInterfaz medicosInterfaz = (MedicosInterfaz) contexto.lookup("MedicosEJB");

            // Recuperamos la sesion del usuario
            HttpSession sesion = peticion.getSession();
            // Cargamos la lista de especialidades
            EspecialidadesInterfaz especialidadesInterfaz = (EspecialidadesInterfaz) contexto.lookup("EspecialidadesEJB");
            List listaEspecialidades = especialidadesInterfaz.findAll();
            sesion.setAttribute("listaEspecialidades", listaEspecialidades);

            String buscar = peticion.getParameter("buscar");
            if (buscar != null && buscar.equals("1")) {
                // Obtenemos los parametros de busqueda
                BuscarMedicosForm formularioBusqueda = (BuscarMedicosForm) form;
                String dni = formularioBusqueda.getDni();
                String numColegiado = formularioBusqueda.getNumColegiado();
                String apellido1 = formularioBusqueda.getApellido1();
                String apellido2 = formularioBusqueda.getApellido2();
                String nombre = formularioBusqueda.getNombre();
                String especialidad = formularioBusqueda.getEspecialidad();

                // Almacenamos el resultado de la consulta en la peticion
                Paginador p = new Paginador(medicosInterfaz.busquedaAvanzada(dni, numColegiado, apellido1, apellido2, nombre, especialidad), peticion);
                List listaMedicos = p.getResultadosPaginados();
                if (listaMedicos != null) {
                    peticion.setAttribute("lista_medicos", listaMedicos);
                    peticion.setAttribute("navegacion", p.getNavegacion());
                    peticion.setAttribute("informacion", p.getMetaInformacion());
                }
            }

            return mapping.findForward("buscar_ok");
        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO MedicosInterfaz " + ne.getMessage());
        }
    }

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException, NamingException, ParseException {
        String delegaEn = mapping.getParameter();

        HttpSession sesion = peticion.getSession();


        if (delegaEn.equalsIgnoreCase("crear")) {
            // codigo para crear un medico
            return this.crearMedicos(mapping, form, peticion, respuesta);
        } else if (delegaEn.equalsIgnoreCase("preparar_insercion")) {
            // modificar un medico
            return this.prepararInsercion(mapping, form, peticion, respuesta);
        } else if (delegaEn.equalsIgnoreCase("cargar")) {
            // modificar un medico
            return this.cargarMedicos(mapping, form, peticion, respuesta);
        } else if (delegaEn.equalsIgnoreCase("modificar")) {
            // modificar un medico
            return this.modificarMedicos(mapping, form, peticion, respuesta);
        } else if (delegaEn.equalsIgnoreCase("eliminar")) {
            // borrar un medico
            return this.eliminarMedicos(mapping, form, peticion, respuesta);
        } else if (delegaEn.equalsIgnoreCase("ver")) {
            // borrar un medico
            return this.verMedicos(mapping, form, peticion, respuesta);
        } else if (delegaEn.equalsIgnoreCase("listar")) {
            return this.listarMedicos(mapping, form, peticion, respuesta);
        } else {
            return this.buscarMedicos(mapping, form, peticion, respuesta);
        }
    }
}
